package com.qch.leecode.cyc2018.algorithm.a2_sort;

import com.qch.leecode.cyc2018.util_comom.Common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 算法思想：排序(桶排序)：451. 根据字符出现频率排序
 * https://leetcode.cn/problems/sort-characters-by-frequency/
 * @Author qch
 * @Date 2022/11/16
 *
 * 自己思考：
 * 字符转int(考虑多了，压根不需要考虑这个，就单纯的桶排序，计数作为下标)
 *
 *
 * 题目：给定一个字符串 s ，根据字符出现的频率对其进行降序排序 。一个字符出现的频率是它出现在字符串中的次数。
 * 返回已排序的字符串。如果有多个答案，返回其中任何一个。
 *
 * 输入: s = "tree"
 * 输出: "eert"
 * 解释: 'e'出现两次，'r'和't'都只出现一次。
 * 因此'e'必须出现在'r'和't'之前。此外，"eetr"也是一个有效的答案。
 *
 *
 * 输入: s = "cccaaa"
 * 输出: "cccaaa"
 * 解释: 'c'和'a'都出现三次。此外，"aaaccc"也是有效的答案。
 * 注意"cacaca"是不正确的，因为相同的字母必须放在一起。
 *
 * 输入: s = "Aabb"
 * 输出: "bbAa"
 * 解释: 此外，"bbaA"也是一个有效的答案，但"Aabb"是不正确的。
 * 注意'A'和'a'被认为是两种不同的字符。
 *
 *
*/
public class L3_FrequencySort451 {
    public static void main(String[] args) {

        String s="tree";
        String sort = frequencySort(s);
        System.out.println(sort);

    }


    public static String frequencySort(String s) {
        Map<Character,Integer>map=new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char ch=s.charAt(i);
            if(map.get(s.charAt(i))==null)
            {
                map.put(ch,1);
            }else {
                map.put(ch,map.get(ch)+1);
            }
        }
        List[] bukets=new ArrayList[s.length()+1];
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            int fluency=entry.getValue();
            if(bukets[fluency]==null){
                bukets[fluency]=new ArrayList();
            }
            for (int i = 0; i < fluency; i++) {
                bukets[fluency].add(entry.getKey());
            }
        }
        StringBuilder snew=new StringBuilder();
        for (int i = bukets.length - 1; i >= 0; i--) {
            if(bukets[i]!=null)
            {
                List buket = bukets[i];
                for (Object o : buket) {
                    snew.append(o);
                }
            }
        }
        return snew.toString();
    }
}
